O objetivo do checkpoint 3 do Lab 3 é realizar novamente a clusterização de algum conjunto de dados, porém desta vez o foco é a visualização dos dados através de técnicas de redução de dimensionalidade.
Para esse checkpoint, foram utilizados dados quantitativos que a CAPES utiliza na avaliação dos programas de pós-graduação em Ciência da Computação segundo o Comitê de Avaliação. Os dados foram coletados da Plataforma Sucupira, e incluem quantificações da produção de artigos, dissertações e teses nos últimos 4 anos para os diferentes PPGs.
Escolha bem as suas variáveis, transformações, normalização, etc., e faça um descritivo das variáveis antes de começar. Também lembre de comentar os grupos encontrados e, principalmente para essa parte do problema, as relações entre as dimensões que você encontrou via PCA e as variáveis originais. Sempre comente também os padrões interessantes que você encontrar.
library(broom)
library(cluster)
library(dplyr, warn.conflicts = FALSE)
library(GGally, warn.conflicts = FALSE)
library(ggdendro)
library(ggplot2)
library(ggfortify)
library(highcharter, quietly = TRUE)
library(knitr)
library(readr)
library(tibble)
library(tidyr)
require(Rtsne, quietly = TRUE)
source('multiplot.R')
Primeiramente, vou carregar os dados e ter uma noção do seus valores:
dados_all <- read_csv("data/capes-cacc.csv")
glimpse(dados_all)
## Observations: 75
## Variables: 31
## $ Instituição <chr> "UNIVERSIDADE FEDERAL DO AMAZONAS",...
## $ Programa <chr> "INFORMÁTICA (12001015012P2)", "CIÊ...
## $ Nível <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3,...
## $ Sigla <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FU...
## $ Tem doutorado <chr> "Sim", "Sim", "Não", "Não", "Não", ...
## $ Docentes colaboradores <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.00,...
## $ Docentes permanentes <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 2...
## $ Docentes visitantes <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.75,...
## $ Resumos em conf <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24...
## $ Resumos expandidos em conf <int> 25, 24, 7, 10, 1, 68, 9, 13, 4, 6, ...
## $ Artigos em conf <int> 390, 284, 115, 73, 150, 269, 179, 0...
## $ Dissertacoes <int> 108, 77, 50, 25, 31, 75, 60, 129, 4...
## $ Teses <int> 14, NA, NA, NA, NA, 24, 5, NA, NA, ...
## $ periodicos_A1 <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 4...
## $ periodicos_A2 <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, ...
## $ periodicos_B1 <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 3...
## $ periodicos_B2 <int> 1, 12, 2, 6, 0, 0, 11, 0, 0, 2, 1, ...
## $ periodicos_B3 <int> 3, 16, 2, 2, 3, 16, 15, 0, 4, 6, 9,...
## $ periodicos_B4 <int> 0, 4, 0, 3, 3, 0, 1, 3, 1, 6, 0, 0,...
## $ periodicos_B5 <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 1...
## $ periodicos_C <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 1...
## $ periodicos_NA <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14,...
## $ per_comaluno_A1 <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, N...
## $ per_comaluno_A2 <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, N...
## $ per_comaluno_B1 <int> 4, 2, 5, 2, 2, 14, 6, 0, 2, 0, 17, ...
## $ per_comaluno_B2 <int> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, NA...
## $ per_comaluno_B3 <int> 2, 2, 0, 1, 0, 7, 9, 0, 2, 0, 4, NA...
## $ per_comaluno_B4 <int> 0, 0, 0, 0, 2, 0, 1, 0, 1, 3, 0, NA...
## $ per_comaluno_B5 <int> 5, 0, 4, 0, 8, 3, 6, 0, 4, 0, 4, NA...
## $ per_comaluno_C <int> 6, 5, 3, 1, 2, 3, 7, 1, 2, 4, 8, NA...
## $ per_comaluno_NA <int> 6, 14, 2, 2, 9, 3, 6, 4, 5, 1, 10, ...
A primeira modificação que vou efetuar nos dados é setar os valores nulos para 0. Além disso, vou criar duas novas colunas:
Logo, além dessas duas variáveis, para essa análise, também considerarei outras seis variáveis:
Para fins de visualização, também vou armazenar o nome da instituição.
dados <- dados_all %>%
replace(is.na(.), 0) %>%
mutate(instituicao = sprintf("%s (%s)", Instituição, Sigla)) %>%
mutate(periodicos_restrito = periodicos_A1 + periodicos_A2 + periodicos_B1) %>%
mutate(periodicos_qualis = periodicos_B1 + periodicos_B2 + periodicos_B3 + periodicos_B4 + periodicos_B5) %>%
select(instituicao,
nivel = Nível,
colaboradores = `Docentes colaboradores`,
permanentes = `Docentes permanentes`,
artigos_conf = `Artigos em conf`,
dissertacoes = Dissertacoes,
teses = Teses,
periodicos_restrito,
periodicos_qualis)
dados %>% head()
## # A tibble: 6 × 9
## instituicao nivel colaboradores
## <chr> <int> <dbl>
## 1 UNIVERSIDADE FEDERAL DO AMAZONAS (UFAM) 5 0.25
## 2 UNIVERSIDADE FEDERAL DO PARÁ (UFPA) 4 5.50
## 3 UNIVERSIDADE FEDERAL DO MARANHÃO (UFMA) 3 3.00
## 4 UNIVERSIDADE ESTADUAL DO MARANHÃO (UEMA) 3 6.25
## 5 FUNDAÇÃO UNIVERSIDADE FEDERAL DO PIAUÍ (FUFPI) 3 1.75
## 6 UNIVERSIDADE FEDERAL DO CEARÁ (UFC) 5 2.00
## # ... with 6 more variables: permanentes <dbl>, artigos_conf <int>,
## # dissertacoes <dbl>, teses <dbl>, periodicos_restrito <int>,
## # periodicos_qualis <int>
Vamos começar analisando o sumário dos dados:
dados %>%
select(-instituicao) %>%
summary()
## nivel colaboradores permanentes artigos_conf
## Min. :3.000 Min. : 0.000 Min. : 3.00 Min. : 0.0
## 1st Qu.:3.000 1st Qu.: 1.125 1st Qu.:11.00 1st Qu.:121.5
## Median :3.000 Median : 3.000 Median :16.00 Median :187.0
## Mean :3.813 Mean : 3.990 Mean :20.22 Mean :239.6
## 3rd Qu.:4.000 3rd Qu.: 5.625 3rd Qu.:25.50 3rd Qu.:293.5
## Max. :7.000 Max. :22.250 Max. :67.25 Max. :959.0
## dissertacoes teses periodicos_restrito periodicos_qualis
## Min. : 0.00 Min. : 0.00 Min. : 0.00 Min. : 1.00
## 1st Qu.: 35.50 1st Qu.: 0.00 1st Qu.: 17.50 1st Qu.: 18.50
## Median : 56.00 Median : 0.00 Median : 40.00 Median : 32.00
## Mean : 73.77 Mean : 14.56 Mean : 56.87 Mean : 42.39
## 3rd Qu.:102.50 3rd Qu.: 14.00 3rd Qu.: 66.00 3rd Qu.: 53.00
## Max. :433.00 Max. :152.00 Max. :355.00 Max. :274.00
O sumário dos dados apresentam informações interessantes:
Também é importante saber o desvio-padrão dessas variáveis:
dados %>%
summarise(sd(colaboradores), sd(permanentes), sd(artigos_conf), sd(dissertacoes), sd(teses), sd(periodicos_qualis), sd(periodicos_restrito))
## # A tibble: 1 × 7
## `sd(colaboradores)` `sd(permanentes)` `sd(artigos_conf)`
## <dbl> <dbl> <dbl>
## 1 3.967444 12.35931 183.73
## # ... with 4 more variables: `sd(dissertacoes)` <dbl>, `sd(teses)` <dbl>,
## # `sd(periodicos_qualis)` <dbl>, `sd(periodicos_restrito)` <dbl>
Podemos ver que artigos em conferência apresentam o maior desvio-padrão, seguido por periódicos no Qualis restrito e dissertações, respectivamente.
Vamos agora analisar a distribuição das variáveis individualmente e aos pares:
dados %>%
select(-instituicao) %>%
ggpairs()
Ao analisar as variáveis de forma individual (diagonal principal), podemos ver que praticamente todas as variáveis apresentam uma distribuição à esquerda com cauda longa à direita. É importante destacar que a variável nível apresenta uma distribuição bimodal, devido ao fato de existirem mais programas de pós-graduação com níveis mais baixos (3 e 4).
Por outro lado, quando analisamos as variáveis aos pares, podemos ver que existem bastante correlações fortes (> 0.7) entre as variáveis. A maior correlação é observada entre a quantidade de periódicos publicados no Qualis restrito e nos demais Qualis (0.925), ou seja, quanto mais se publica periódicos em eventos com Qualis restrito, mais se publica nos demais Qualis. Obviamente, isso não representa uma causalidade, mas, de certa forma, é um comportamento esperado. Também pode-se observar forte correlação entre a quantidade artigos publicados em periódicos com Qualis restrito e a docentes permanentes (0.901) e artigos publicados em conferências (0.904).
Agora, quero fazer algumas visualizações. Primeiramente, quero analisar a distribuição dos níveis dos programas de pós-graduação do país:
dados %>%
ggplot(aes(x = nivel)) +
geom_bar()
Como visto anteriormente, a maior parte dos programas de pós-graduação apresentam os níveis 3 e 4. Há apenas 5 programas com nível 5. É interessante observar que há mais programas de nível 7 do que 6 (5 contra 3, respectivamente).
Vamos analisar quais são as instituições que mais produzem dissertações de Mestrado:
dados %>%
top_n(10, dissertacoes) %>%
ggplot(aes(x = reorder(instituicao, dissertacoes), y = dissertacoes)) +
geom_bar(stat = "identity") +
coord_flip()
A UFPE é a universidade brasileira que mais produz dissertações de Mestrado no país (+400), produzindo mais que o dobro da segunda colocada, a USP (São Carlos).
E qual será a universidade que mais produz teses de Doutorado?
dados %>%
top_n(10, teses) %>%
ggplot(aes(x = reorder(instituicao, teses), y = teses)) +
geom_bar(stat = "identity") +
coord_flip()
Nesse caso, ocorre o inverso, com a USP (São Carlos) à frente da UFPE. Porém, a quantidade de teses produzidas é bem mais parecida entre as duas universidades.
Qual a universidade que mais publica artigos em conferência?
dados %>%
top_n(10, artigos_conf) %>%
ggplot(aes(x = reorder(instituicao, artigos_conf), y = artigos_conf)) +
geom_bar(stat = "identity") +
coord_flip()
De forma individual, a USP de São Carlos é a universidade responsável pelo maior número de publicações em conferências. Porém, a UFPE aparece com um número maior devido quando somados os dois programas de pós-graduação (stricto sensu e profisional).
Quero agora saber a respeito das publicações em periódicos. Primeiramente, quero analisar as publicações dos periódicos fora do Qualis restrito (B2 a B5):
dados %>%
top_n(10, periodicos_qualis) %>%
ggplot(aes(x = reorder(instituicao, periodicos_qualis), y = periodicos_qualis)) +
geom_bar(stat = "identity") +
coord_flip()
Novamente, a USP (São Carlos) lidera o ranking, com aproximadamente o dobro da segunda colocada, a UniCamp. A UFRJ publica aproximadamente 200 artigos quando considerados os dois programas da pós-graduação (Informática e Engenharia de Sistemas e Computação).
Por fim, quero fazer a mesma análise, porém para os artigos publicados em periódicos no Qualis restrito:
dados %>%
top_n(10, periodicos_restrito) %>%
ggplot(aes(x = reorder(instituicao, periodicos_restrito), y = periodicos_restrito)) +
geom_bar(stat = "identity") +
coord_flip()
Mais uma vez, a USP de São Carlos encabeça o ranking, seguido pela UFPE se considerarmos os dois programas de pós-graduação descritos anteriormente.
É válido destacar que, de maneira geral, algumas das universidades mostradas nos gráficos acima aparecem em praticamente todos os gráficos. Talvez isso indique algum grupo que vamos encontrar no agrupamento que iremos realizar.
Para finalizar a análise descritiva, quero analisar a disposição das variáveis de forma individual:
plot_nivel <- dados %>%
ggplot(aes(x = 0, y = nivel)) +
geom_point(alpha = 0.3)
plot_colaboradores <- dados %>%
ggplot(aes(x = 0, y = colaboradores)) +
geom_boxplot() +
geom_point(alpha = 0.5, position = position_jitter(width = 0.01))
plot_permanentes <- dados %>%
ggplot(aes(x = 0, y = permanentes)) +
geom_boxplot() +
geom_point(alpha = 0.5, position = position_jitter(width = 0.01))
plot_artigos_conf <- dados %>%
ggplot(aes(x = 0, y = artigos_conf)) +
geom_boxplot() +
geom_point(alpha = 0.5, position = position_jitter(width = 0.01))
plot_dissertacoes <- dados %>%
ggplot(aes(x = 0, y = dissertacoes)) +
geom_boxplot() +
geom_point(alpha = 0.5, position = position_jitter(width = 0.01))
plot_teses <- dados %>%
ggplot(aes(x = 0, y = teses)) +
geom_boxplot() +
geom_point(alpha = 0.5, position = position_jitter(width = 0.01))
plot_per_qualis <- dados %>%
ggplot(aes(x = 0, y = periodicos_qualis)) +
geom_boxplot() +
geom_point(alpha = 0.5, position = position_jitter(width = 0.01))
plot_per_restrito <- dados %>%
ggplot(aes(x = 0, y = periodicos_restrito)) +
geom_boxplot() +
geom_point(alpha = 0.5, position = position_jitter(width = 0.01))
multiplot(plot_nivel, plot_colaboradores, plot_permanentes, plot_artigos_conf, plot_dissertacoes, plot_teses, plot_per_qualis, plot_per_restrito, cols = 4)
Pelo gráfico acima, conseguimos confirmar que as variáveis se concentram na parte inferior do gráfico, como visto no gráfico de pares. Eu também arriscaria dizer que existem de 3 a 5 grupos de universidades. Vamos verificar isso na próxima seção.
Antes de efetuarmos a clusterização, vou efetuar a padronização dos dados. Como visto no checkpoint anterior, isso é de extrema imoportância para evitar que variáveis com range grande se sobreponham sobre as variáveis de baixo range de valores.
dados_pro <- dados %>%
mutate(colaboradores = as.vector(scale(colaboradores)),
permanentes = as.vector(scale(permanentes)),
artigos_conf = as.vector(scale(artigos_conf+1)),
dissertacoes = as.vector(scale(dissertacoes+1)),
teses = as.vector(scale(teses+1)),
periodicos_qualis = as.vector(scale(periodicos_qualis+1)),
periodicos_restrito = as.vector(scale(periodicos_restrito+1)))
dados_pro %>% head()
## # A tibble: 6 × 9
## instituicao nivel colaboradores
## <chr> <int> <dbl>
## 1 UNIVERSIDADE FEDERAL DO AMAZONAS (UFAM) 5 -0.9426725
## 2 UNIVERSIDADE FEDERAL DO PARÁ (UFPA) 4 0.3805977
## 3 UNIVERSIDADE FEDERAL DO MARANHÃO (UFMA) 3 -0.2495310
## 4 UNIVERSIDADE ESTADUAL DO MARANHÃO (UEMA) 3 0.5696363
## 5 FUNDAÇÃO UNIVERSIDADE FEDERAL DO PIAUÍ (FUFPI) 3 -0.5645953
## 6 UNIVERSIDADE FEDERAL DO CEARÁ (UFC) 5 -0.5015824
## # ... with 6 more variables: permanentes <dbl>, artigos_conf <dbl>,
## # dissertacoes <dbl>, teses <dbl>, periodicos_restrito <dbl>,
## # periodicos_qualis <dbl>
O primeiro agrupamento que vou efetuar é a clusterização hierárquica. Previamente, eu realizei alguns testes empíricos com combinações diferentes de métodos de distância e agrupamento. Os melhores parâmetros que eu encontrei são mostrados no código a seguir:
distancias <- dados_pro %>%
column_to_rownames("instituicao") %>%
dist(method = "maximum")
## Warning: Setting row names on a tibble is deprecated.
clust_hier <- distancias %>%
hclust(method = "ward.D")
ggdendrogram(clust_hier, rotate = TRUE)
O dendograma acima mostra a árvore de agrupamento realizada pelo algoritmo de clusterização hierárquica. Visualmente, eu acredito que 3 ou 4 grupos formariam uma boa clusterização. Além disso, também quero destacar alguns pontos interessantes:
Vamos agora plotar o gráfico de silhueta. Eu testei o gráfico para 3 e 4 grupos. Acabei escolhendo 4 grupos, pois achei a quantidade de pontos em cada grupo mais homogênea em relação a somente 3 grupos.
plot(silhouette(cutree(clust_hier, k = 4), distancias))
Pode-se perceber pelo gráfico acima que os 4 grupos possuem entre 8 e 28 universidades. Ademais, a maior parte dos pontos estão bem alocados em seus grupos. O grupo 3 é o grupo com o melhor alocamento de pontos, enquanto o grupo 2 apresenta a maior dúvida sobre a alocação de alguns de seus pontos.
Tendo em vista que clusterizamos as universidades em 4 grupos pelo algoritmo de clusterização hierárquica, vamos agora analisar as características de cada um dos grupos e distingui-los:
atribuicoes <- cbind(dados_pro, grupo = cutree(clust_hier, k = 4))
atribuicoes %>%
select(-instituicao) %>%
ggparcoord(columns = c(1:8), groupColumn="grupo", scale = "globalminmax") +
facet_grid(paste("Grupo ", grupo) ~ .) +
theme(legend.position = "none") +
scale_y_continuous(breaks=c(0, 2, 4, 6))
De acordo com o gráfico acima, eu nomearia os grupos da seguinte maneira (fazendo analogia ao campeonato brasileiro):
Grupo 1: Série B (Universidades que brigam para subir) Universidades de nível 3-5, poucos colaboradores e o restante das variáveis na média geral;
Grupo 2: Série C (Universidades que querem se tornar "profissionais") Universidades de nível 3-4, com mais colaboradores que as do Grupo 1, porém almejam o Doutorado (Série B) em sua maioria.
Grupo 3: Série D (Várzea) Universidades de nível 3, sem Doutorado, e com a maioria das variáveis abaixo da média.
Grupo 4: Série A (Universidades supra-sumo) Universidades de nível 6-7, com alto nível de produção científica em geral.
Vamos agora visualizar alguns integrantes desses grupos:
dados_hclust <- atribuicoes %>%
left_join(dados, by = c("instituicao")) %>%
select(instituicao, nivel.y, colaboradores.y, permanentes.y, artigos_conf.y, dissertacoes.y, teses.y, periodicos_qualis.y, periodicos_restrito.y, grupo)
dados_hclust %>%
filter(grupo == 1) %>%
head(10)
## instituicao nivel.y
## 1 UNIVERSIDADE FEDERAL DO AMAZONAS (UFAM) 5
## 2 UNIVERSIDADE FEDERAL DO CEARÁ (UFC) 5
## 3 UNIVERSIDADE DE FORTALEZA (UNIFOR) 4
## 4 UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE (UFRN) 5
## 5 UNIVERSIDADE FEDERAL DA BAHIA (UFBA/UNIFACS/UEFS) 4
## 6 UNIVERSIDADE FEDERAL DA BAHIA (UFBA/UEFS) 3
## 7 UNIVERSIDADE FEDERAL DA BAHIA (UFBA) 4
## 8 UNIVERSIDADE FEDERAL DO RIO DE JANEIRO (UFRJ/INF) 4
## 9 UNIVERSIDADE FEDERAL FLUMINENSE (UFF) 5
## 10 UNIVERSIDADE FEDERAL DO ESTADO DO RIO DE JANEIRO (UNIRIO) 4
## colaboradores.y permanentes.y artigos_conf.y dissertacoes.y teses.y
## 1 0.25 24.75 390 108 14
## 2 2.00 20.75 269 75 24
## 3 1.00 16.00 179 60 5
## 4 2.25 26.25 389 108 29
## 5 3.00 19.00 277 0 20
## 6 0.50 23.25 255 41 0
## 7 3.75 22.00 230 8 0
## 8 2.75 28.25 288 101 16
## 9 0.00 40.00 504 110 56
## 10 0.50 17.50 268 89 0
## periodicos_qualis.y periodicos_restrito.y grupo
## 1 33 53 1
## 2 46 79 1
## 3 59 50 1
## 4 53 99 1
## 5 34 50 1
## 6 30 45 1
## 7 30 51 1
## 8 75 101 1
## 9 79 138 1
## 10 32 27 1
dados_hclust %>%
filter(grupo == 2) %>%
head(10)
## instituicao nivel.y
## 1 UNIVERSIDADE FEDERAL DO PARÁ (UFPA) 4
## 2 UNIVERSIDADE FEDERAL DA PARAÍBA/JOÃO PESSOA (UFPB/J.P) 3
## 3 UNIVERSIDADE FEDERAL DE CAMPINA GRANDE (UFCG) 4
## 4 UNIVERSIDADE FEDERAL DE PERNAMBUCO (UFPE/Prof) 3
## 5 FUNDAÇÃO UNIVERSIDADE DE PERNAMBUCO (FESP/UPE) 3
## 6 CENTRO DE ESTUDOS E SISTEMAS AVANÇADOS DO RECIFE (CESAR/Prof) 3
## 7 UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO (UFES) 4
## 8 UNIVERSIDADE DE SÃO PAULO (USP/EACH) 3
## 9 UNIVERSIDADE FEDERAL DE SÃO PAULO (UNIFESP) 3
## 10 UNIVERSIDADE FEDERAL DO ABC (UFABC) 3
## colaboradores.y permanentes.y artigos_conf.y dissertacoes.y teses.y
## 1 5.50 14.00 284 77 0
## 2 5.00 20.00 322 108 0
## 3 9.25 31.00 338 104 40
## 4 8.50 32.00 585 92 0
## 5 6.50 10.75 255 71 0
## 6 13.75 12.50 79 93 0
## 7 6.00 22.25 336 110 5
## 8 6.25 14.25 227 56 0
## 9 3.00 21.00 167 24 0
## 10 7.25 29.75 156 60 0
## periodicos_qualis.y periodicos_restrito.y grupo
## 1 86 78 2
## 2 42 52 2
## 3 56 64 2
## 4 69 122 2
## 5 33 29 2
## 6 1 2 2
## 7 11 43 2
## 8 59 36 2
## 9 67 75 2
## 10 37 49 2
dados_hclust %>%
filter(grupo == 3) %>%
head(10)
## instituicao
## 1 UNIVERSIDADE FEDERAL DO MARANHÃO (UFMA)
## 2 UNIVERSIDADE ESTADUAL DO MARANHÃO (UEMA)
## 3 FUNDAÇÃO UNIVERSIDADE FEDERAL DO PIAUÍ (FUFPI)
## 4 UNIVERSIDADE ESTADUAL DO CEARÁ (UECE/Prof)
## 5 UNIVERSIDADE ESTADUAL DO CEARÁ (UECE)
## 6 INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO CEARÁ (IFCE)
## 7 UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE (UFRN/Prof)
## 8 UNIVERSIDADE DO ESTADO DO RIO GRANDE DO NORTE (UERN/UFERSA)
## 9 UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE)
## 10 UNIVERSIDADE FEDERAL DE ALAGOAS (UFAL)
## nivel.y colaboradores.y permanentes.y artigos_conf.y dissertacoes.y
## 1 3 3.00 10.00 115 50
## 2 3 6.25 14.00 73 25
## 3 3 1.75 9.50 150 31
## 4 3 6.25 15.75 0 129
## 5 3 2.75 8.50 120 45
## 6 3 0.75 9.00 92 3
## 7 3 2.00 8.50 60 12
## 8 3 4.25 13.50 127 94
## 9 3 3.50 14.00 132 26
## 10 3 5.75 14.00 185 23
## teses.y periodicos_qualis.y periodicos_restrito.y grupo
## 1 0 19 23 3
## 2 0 18 5 3
## 3 0 24 17 3
## 4 0 7 2 3
## 5 0 17 18 3
## 6 0 20 14 3
## 7 0 4 6 3
## 8 0 12 14 3
## 9 0 42 32 3
## 10 0 34 48 3
dados_hclust %>%
filter(grupo == 4) %>%
head(10)
## instituicao nivel.y
## 1 UNIVERSIDADE FEDERAL DE PERNAMBUCO (UFPE) 6
## 2 UNIVERSIDADE FEDERAL DO RIO DE JANEIRO (UFRJ) 7
## 3 PONTIFÍCIA UNIVERSIDADE CATÓLICA DO RIO DE JANEIRO (PUC/RIO) 7
## 4 UNIVERSIDADE FEDERAL DE MINAS GERAIS (UFMG) 7
## 5 UNIVERSIDADE DE SÃO PAULO (USP/IME) 6
## 6 UNIVERSIDADE DE SÃO PAULO/SÃO CARLOS (★USP/SC★) 6
## 7 UNIVERSIDADE ESTADUAL DE CAMPINAS (UNICAMP) 7
## 8 UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL (UFRGS) 7
## colaboradores.y permanentes.y artigos_conf.y dissertacoes.y teses.y
## 1 22.25 58.50 763 433 144
## 2 2.00 38.75 359 154 87
## 3 0.00 25.25 367 146 68
## 4 4.25 47.50 809 213 49
## 5 9.75 32.75 296 120 57
## 6 13.25 67.25 959 220 152
## 7 5.50 41.50 546 151 73
## 8 3.00 54.25 680 177 73
## periodicos_qualis.y periodicos_restrito.y grupo
## 1 113 187 4
## 2 122 194 4
## 3 50 106 4
## 4 105 231 4
## 5 116 144 4
## 6 274 355 4
## 7 131 235 4
## 8 86 238 4
É interessante notar que a UFPB e UFCG estão situadas no Grupo 2.
Agora vou utilizar o K-means para clusterização. Vou começar analisando o valor de tot.withinss para o K-means aplicado de 2 a 12 grupos. O valor de tot.withinss representa o somatório dos quadrados das distâncias de cada ponto em cluster \(c_i\) para o centro do cluster. Esse valor tende a zero quando o número de clusters é igual ao número de pontos.
set.seed(1234)
explorando_k <- tibble(k = 2:12) %>%
group_by(k) %>%
do(
kmeans(select(dados_pro, -instituicao), centers = .$k, nstart = 20) %>% glance()
)
explorando_k %>%
ggplot(aes(x = k, y = tot.withinss)) +
geom_line() +
geom_point() +
scale_x_continuous(breaks=c(2:12))
Pelo gráfico, podemos ver que o valor de tot.withinss descresce bastante de 2 para 3 clusters e de 3 para 4 clusters. De 4 clusters em diante, esse valor descrece pouco. Logo, por esse grafico, podemos definir 4 clusters como a quantidade de clusters "ideal".
Podemos também analisar também a proporção entre as distâncias dos centróides dos clusters em relação ao centróide dos pontos, e a distância de todos os pontos para o centróide dos pontos:
explorando_k %>%
ggplot(aes(x = k, y = betweenss/totss)) +
geom_line() +
geom_point() +
scale_x_continuous(breaks = c(2:12))
Esse gráfico apresenta um comportamente parecido com o anterior. Novamente, a escolha de 4 clusters é a mais sensata.
Visto que 4 clusters representam a melhor escolha para o número de clusters de acordo com os gráficos, vamos analisar a representação desses grupos:
set.seed(1234)
km <- dados_pro %>%
select(-instituicao) %>%
kmeans(centers = 4, nstart = 20)
km %>%
augment(dados_pro) %>%
select(-instituicao) %>%
ggparcoord(columns = c(1:8), groupColumn = ".cluster", scale = "globalminmax") +
facet_grid(paste("Grupo ", .cluster) ~ .) +
ylab("Z-score") +
theme(legend.position = "none") +
scale_y_continuous(breaks = c(0, 2, 4, 6))
Seguindo a mesma ideia dos grupos da clusterização hierárquica, eu nomearia os grupos da seguinte forma:
Grupo 1: Série D (Várzea) Universidades de nível 3 e 4, sem Doutorado ou pouco produtivo, e com a maioria das variáveis abaixo da média de maneira geral.
Grupo 1: Fora do padrão (Universidades modelo) Universidades de nível 6, com todas as variáveis bem acima da média. Altíssimoo nível de produção científica.
Grupo 3: Série B Universidades de nível 3-5, e acima da média de maneira geral.
Grupo 4: Série A Universidades de nível 5-7, poucos colabores em sua maioria, mas com nível de produção científica acima da média
Ao meu ver, os grupos 1, 3 e 4 são bastante parecidos com os grupos equivalentes da clusterização hierárquica.
Assim como na seção anterior, vamos analisar as universidades participantes de cada grupo:
dados_km <- km %>%
augment(dados)
dados_km %>%
filter(.cluster == 1) %>%
head(10)
## instituicao
## 1 UNIVERSIDADE FEDERAL DO MARANHÃO (UFMA)
## 2 UNIVERSIDADE ESTADUAL DO MARANHÃO (UEMA)
## 3 FUNDAÇÃO UNIVERSIDADE FEDERAL DO PIAUÍ (FUFPI)
## 4 UNIVERSIDADE ESTADUAL DO CEARÁ (UECE/Prof)
## 5 UNIVERSIDADE ESTADUAL DO CEARÁ (UECE)
## 6 INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO CEARÁ (IFCE)
## 7 UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE (UFRN/Prof)
## 8 UNIVERSIDADE DO ESTADO DO RIO GRANDE DO NORTE (UERN/UFERSA)
## 9 UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE)
## 10 FUNDAÇÃO UNIVERSIDADE DE PERNAMBUCO (FESP/UPE)
## nivel colaboradores permanentes artigos_conf dissertacoes teses
## 1 3 3.00 10.00 115 50 0
## 2 3 6.25 14.00 73 25 0
## 3 3 1.75 9.50 150 31 0
## 4 3 6.25 15.75 0 129 0
## 5 3 2.75 8.50 120 45 0
## 6 3 0.75 9.00 92 3 0
## 7 3 2.00 8.50 60 12 0
## 8 3 4.25 13.50 127 94 0
## 9 3 3.50 14.00 132 26 0
## 10 3 6.50 10.75 255 71 0
## periodicos_restrito periodicos_qualis .cluster
## 1 23 19 1
## 2 5 18 1
## 3 17 24 1
## 4 2 7 1
## 5 18 17 1
## 6 14 20 1
## 7 6 4 1
## 8 14 12 1
## 9 32 42 1
## 10 29 33 1
dados_km %>%
filter(.cluster == 2) %>%
head()
## instituicao nivel colaboradores
## 1 UNIVERSIDADE FEDERAL DE PERNAMBUCO (UFPE) 6 22.25
## 2 UNIVERSIDADE DE SÃO PAULO/SÃO CARLOS (★USP/SC★) 6 13.25
## permanentes artigos_conf dissertacoes teses periodicos_restrito
## 1 58.50 763 433 144 187
## 2 67.25 959 220 152 355
## periodicos_qualis .cluster
## 1 113 2
## 2 274 2
dados_km %>%
filter(.cluster == 3) %>%
head(10)
## instituicao nivel
## 1 UNIVERSIDADE FEDERAL DO AMAZONAS (UFAM) 5
## 2 UNIVERSIDADE FEDERAL DO PARÁ (UFPA) 4
## 3 UNIVERSIDADE FEDERAL DO CEARÁ (UFC) 5
## 4 UNIVERSIDADE DE FORTALEZA (UNIFOR) 4
## 5 UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE (UFRN) 5
## 6 UNIVERSIDADE FEDERAL DA PARAÍBA/JOÃO PESSOA (UFPB/J.P) 3
## 7 UNIVERSIDADE FEDERAL DE CAMPINA GRANDE (UFCG) 4
## 8 UNIVERSIDADE FEDERAL DE PERNAMBUCO (UFPE/Prof) 3
## 9 UNIVERSIDADE FEDERAL DA BAHIA (UFBA/UNIFACS/UEFS) 4
## 10 UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO (UFES) 4
## colaboradores permanentes artigos_conf dissertacoes teses
## 1 0.25 24.75 390 108 14
## 2 5.50 14.00 284 77 0
## 3 2.00 20.75 269 75 24
## 4 1.00 16.00 179 60 5
## 5 2.25 26.25 389 108 29
## 6 5.00 20.00 322 108 0
## 7 9.25 31.00 338 104 40
## 8 8.50 32.00 585 92 0
## 9 3.00 19.00 277 0 20
## 10 6.00 22.25 336 110 5
## periodicos_restrito periodicos_qualis .cluster
## 1 53 33 3
## 2 78 86 3
## 3 79 46 3
## 4 50 59 3
## 5 99 53 3
## 6 52 42 3
## 7 64 56 3
## 8 122 69 3
## 9 50 34 3
## 10 43 11 3
dados_km %>%
filter(.cluster == 4) %>%
head(7)
## instituicao nivel
## 1 UNIVERSIDADE FEDERAL DO RIO DE JANEIRO (UFRJ) 7
## 2 UNIVERSIDADE FEDERAL FLUMINENSE (UFF) 5
## 3 PONTIFÍCIA UNIVERSIDADE CATÓLICA DO RIO DE JANEIRO (PUC/RIO) 7
## 4 UNIVERSIDADE FEDERAL DE MINAS GERAIS (UFMG) 7
## 5 UNIVERSIDADE DE SÃO PAULO (USP/IME) 6
## 6 UNIVERSIDADE ESTADUAL DE CAMPINAS (UNICAMP) 7
## 7 UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL (UFRGS) 7
## colaboradores permanentes artigos_conf dissertacoes teses
## 1 2.00 38.75 359 154 87
## 2 0.00 40.00 504 110 56
## 3 0.00 25.25 367 146 68
## 4 4.25 47.50 809 213 49
## 5 9.75 32.75 296 120 57
## 6 5.50 41.50 546 151 73
## 7 3.00 54.25 680 177 73
## periodicos_restrito periodicos_qualis .cluster
## 1 194 122 4
## 2 138 79 4
## 3 106 50 4
## 4 231 105 4
## 5 144 116 4
## 6 235 131 4
## 7 238 86 4
Interessante notar as universidades do Grupo 2. A UFPB e UFCG, agora, aparecem na Série B.
dados_pca <- dados_pro %>%
select(-instituicao) %>%
prcomp(scale = FALSE)
as.data.frame(dados_pca$rotation)
## PC1 PC2 PC3 PC4
## nivel -0.3987424 -0.39555358 0.52035701 -0.3810568
## colaboradores -0.1695414 0.87508615 0.01662147 -0.2867285
## permanentes -0.3771071 0.01899928 -0.13278423 0.3423898
## artigos_conf -0.3700856 -0.05045480 -0.18916490 0.5057392
## dissertacoes -0.3444813 0.23179410 0.49771651 0.4396016
## teses -0.3724407 0.02779968 0.13314825 -0.3641500
## periodicos_restrito -0.3847241 -0.13351003 -0.26950427 -0.1122760
## periodicos_qualis -0.3573444 -0.05028613 -0.58090840 -0.2472224
## PC5 PC6 PC7 PC8
## nivel 0.45139603 -0.061567265 0.14935877 -0.19674669
## colaboradores 0.34877604 0.006328333 -0.01758259 -0.03156735
## permanentes 0.05036907 0.752704036 0.37063880 -0.12685934
## artigos_conf 0.32198135 -0.224705020 -0.58701560 -0.26492224
## dissertacoes -0.37559807 -0.375097007 0.27893822 0.16448305
## teses -0.59598147 0.281005984 -0.51732230 -0.09165590
## periodicos_restrito 0.14347490 -0.026733780 -0.05119914 0.85147105
## periodicos_qualis -0.22701321 -0.398417983 0.38389078 -0.33698477
tidy(dados_pca, "pcs") %>%
ggplot(aes(x = PC, y = cumulative, label = cumulative)) +
geom_line() +
geom_point() +
geom_text(vjust = 1, hjust = -.1)
dados_pro_aug <- km %>% augment(dados)
dados_pca %>%
augment(dados_pro_aug) %>%
ggplot(aes(x = .fittedPC1, y = .fittedPC2, color = .cluster)) +
geom_point(alpha = 0.8) +
theme(legend.position = "none")
p = dados_pca %>%
augment(dados_pro_aug) %>%
hchart("scatter", hcaes(x = .fittedPC1, y = .fittedPC2, color = .cluster)) %>%
hc_tooltip(pointFormat = "<b>{point.instituicao}</b><br>
Nível: {point.nivel}<br>
Colaboradores: {point.colaboradores}<br>
Permanentes: {point.permanentes}<br>
Artigos Conf.: {point.artigos_conf}<br>
Dissertações: {point.dissertacoes}<br>
Teses: {point.teses}<br>
Per. A1-B1: {point.periodicos_restrito}<br>
Per. B2-B5: {point.periodicos_qualis}")
p
autoplot(dados_pca, label = F, label.size = 3, shape = T, colour = km$cluster, loadings = TRUE, loadings.color = 'red', loadings.label = TRUE, loadings.label.size = 3, loadings.label.hjust=1.1)
## Warning in if (value %in% columns) {: a condição tem comprimento > 1 e
## somente o primeiro elemento será usado
set.seed(1234)
tsne.out = dados_pro %>%
select(-instituicao) %>%
Rtsne(perplexity = 20)
df <- as.data.frame(tsne.out$Y)
dados_tsne <- cbind(dados_pro_aug, df)
dados_tsne %>%
ggplot(aes(x = V1, y = V2, color = .cluster)) +
geom_point(alpha = 0.8) +
theme(legend.position = "none")
p <- dados_tsne %>%
hchart("scatter", hcaes(x = V1, y = V2, color = .cluster)) %>%
hc_tooltip(pointFormat = "<b>{point.instituicao}</b><br>
Nível: {point.nivel}<br>
Colaboradores: {point.colaboradores}<br>
Permanentes: {point.permanentes}<br>
Artigos Conf.: {point.artigos_conf}<br>
Dissertações: {point.dissertacoes}<br>
Teses: {point.teses}<br>
Per. A1-B1: {point.periodicos_restrito}<br>
Per. B2-B5: {point.periodicos_qualis}")
p